package com.doraemon.controller.admin;

import com.doraemon.dto.DishDTO;
import com.doraemon.dto.DishPageQueryDTO;
import com.doraemon.entity.Dish;
import com.doraemon.result.PageResult;
import com.doraemon.result.Result;
import com.doraemon.service.DishService;
import com.doraemon.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

/**
 * 菜品管理Controller
 **/
@RestController
@RequestMapping("/admin/dish")
@Slf4j
@Api(tags = "菜品相关接口")
public class DishController {

    @Autowired
    private DishService dishService; // 注入菜品Service层
    @Autowired
    private RedisTemplate redisTemplate; // 注入redis操作工具类

    /***
     * 清理缓存数据
     * 清理 Redis 缓存中符合指定模式的所有键值数据
     * ---
     * @param pattern 键的模式
     * @return: void
     */
    private void cleanCache(String pattern) {
        // 获取所有符合 pattern 模式的键
        Set keys = redisTemplate.keys(pattern);
        redisTemplate.delete(keys); // 删除数据
    }

    /***
     * 新增菜品
     * -由Spring Data Redis处理-
     * ---
     * @param dishDTO 菜品DTO类（前端参数）
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @PostMapping()
    @ApiOperation("新增菜品")
    public Result<String> addDish(@RequestBody DishDTO dishDTO) { // 前端参数封装实体
        log.info("新增菜品：{}", dishDTO);

        // 调用Service层 addDishWithFlavour 方法，新增菜品
        dishService.addDishWithFlavour(dishDTO);

        // 清理新增的菜品缓存数据（保存数据一致性）
        String key = "dish_" + dishDTO.getCategoryId(); // 获取redis菜品key的规则模式
        cleanCache(key);

        return Result.success();
    }

    /***
     * 批量删除菜品
     * -由Spring Data Redis处理-
     * ---
     * @param ids 菜品id集合
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @DeleteMapping()
    @ApiOperation("批量删除菜品")
    public Result<String> deleteDish(@RequestParam List<Long> ids) {
        log.info("批量删除菜品：id为{}", ids);

        // 调用Service层 deleteBatch 方法，批量删除菜品
        dishService.deleteBatch(ids);

        // 清理所有菜品缓存数据（保存数据一致性）
        cleanCache("dish_*");

        return Result.success();
    }

    /***
     * 修改菜品售卖状态
     * -由Spring Data Redis处理-
     * ---
     * @param status 菜品售卖状态 0 停售 1 起售
     * @param id 菜品id
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @PostMapping("status/{status}")
    @ApiOperation("修改菜品售卖状态")
    public Result<String> updateStatus(@PathVariable Integer status, @RequestParam Long id) {
        if (status == 1) {
            log.info("菜品售卖状态修改：ID={}，状态=起售", id);
        } else log.info("菜品售卖状态修改：ID={}，状态=停售", id);

        // 调用Service层 updateStatus 方法，修改菜品售卖状态
        dishService.updateStatus(status, id);

        // 清理所有菜品缓存数据（保存数据一致性）
        cleanCache("dish_*");

        return Result.success();
    }


    /***
     * 修改菜品
     * -由Spring Data Redis处理-
     * ---
     * @param dishDTO 菜品DTO类
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @PutMapping()
    @ApiOperation("修改菜品")
    public Result<String> updateDish(@RequestBody DishDTO dishDTO) {
        log.info("修改菜品：{}", dishDTO);

        // 调用Service层 updateWithFlavor 方法，修改菜品
        dishService.updateWithFlavor(dishDTO);

        // 清理所有菜品缓存数据（保存数据一致性）
        cleanCache("dish_*");

        return Result.success();
    }

    /***
     * 分页查询
     * ---
     * @param dishPageQueryDTO 菜品分页DTO类
     * @return: com.doraemon.result.Result<com.doraemon.result.PageResult>
     */
    @GetMapping("/page")
    @ApiOperation("菜品分页查询")
    public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {
        log.info("菜品分页查询：页码 {},每页展示 {},名称 {},状态 {}",
                dishPageQueryDTO.getPage(),
                dishPageQueryDTO.getPageSize(),
                dishPageQueryDTO.getName(),
                dishPageQueryDTO.getStatus());

        // 调用Service层 pageQuery 方法，分页查询菜品
        PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);

        return Result.success(pageResult);
    }

    /***
     * 根据id查询菜品
     * ---
     * @param id 菜品id
     * @return: com.doraemon.result.Result<com.doraemon.vo.DishVO> 菜品VO类
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询菜品")
    public Result<DishVO> getById(@PathVariable Long id) {
        log.info("根据id查询菜品：{}", id);

        // 调用Service层 getByIdWithFlavor 方法，获取菜品VO类
        DishVO dishVO = dishService.getByIdWithFlavor(id);

        return Result.success(dishVO);
    }

    /***
     * 根据分类id查询菜品
     * ---
     * @param categoryId 分类id
     * @return: com.doraemon.result.Result<java.util.List < com.doraemon.entity.Dish>> 菜品实体集合
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public Result<List<Dish>> getByCategoryId(@RequestParam Long categoryId) {
        log.info("根据分类id查询菜品：{}", categoryId);

        // 调用Service层 getListByCategoryId 方法，获取菜品实体类集合
        List<Dish> dishes = dishService.getListByCategoryId(categoryId);

        return Result.success(dishes);
    }

    // TODO 模糊查询未完成 Get请求 url：dish/list?name=
}
